Data compression and decompression techniques remove redundancy in a data stream to provide more efficient utilization of memory and communication channel resources. Lossless compression methods are used for data streams that require the original data to be exactly reconstructed from the compressed data stream without any loss of information. One category of lossless compression algorithms, generally termed LZ compression, relies on substitution of a code for a frequently repeating data pattern.
One group of LZ compression algorithms dynamically creates a table of frequently encountered data patterns as the data stream is compressed. Code sequences indicating the location in the table of the frequently encountered data patterns are generated and embedded in the data stream. The table is added by the compression system as part of the compressed data stream for use by the decompression system to decompress the compressed data stream.
Another group of LZ compression algorithms does not add a table of frequently repeated sequences to the data stream. Instead, the decompression system dynamically recreates the repeating data patterns by copying a specified number of data units starting from a buffer location specified by codes embedded in the compressed data stream.
Both groups of LZ compression algorithms send uncompressed literal data that is not part of a repeating pattern from the compression system to the decompression system. A data type flag is typically incorporated into the data stream to indicate whether a particular data unit is code or literal data, resulting in a non-integral data unit size. In compression systems using a byte as the data unit, a data type flag must be added to each data byte by the compression system, resulting in each data byte represented by 9 bits, including 8 bits of data and the data type flag. The decompression system for this compressed data stream must strip out the data type flag and repack the data stream into bytes to reconstruct the original data.